#include "Reactor.hpp"
#include "NetCal.hpp"
#include "Protocol.hpp"
#include "Connection.hpp"
#include "Listener.hpp"
#include "Channel.hpp"
#include <memory>

int main(int argc, char* argv[]){
	if(argc != 2){
		std::cerr<<"Usage: " << argv[0] << "  port" <<std::endl;
		exit(USAGE_ERR);
	}

	uint16_t port = std::stoi(argv[1]);

	// 初始化计算模块
	std::shared_ptr<Cal> cal = std::make_shared<Cal>();

	// 创建协议
	std::shared_ptr<Protocol> protocol = std::make_shared<Protocol>([cal](Request& req)->Response{
		return cal->Execute(req);
	});

	// 创建监听模块
	std::shared_ptr<Connection> conn = std::make_shared<Listener>(port);

	// 注册业务处理函数
	conn->RegisterHandler([protocol](std::string& inbuffer)->std::string{
		std::string resp_str;
		
		// 首先尝试使用标准协议解析（保留原有功能）
		bool has_standard_protocol = false;
		std::string temp_buffer = inbuffer;
		while(true){
			std::string package;
			if(protocol->Decode(temp_buffer, package)){
				has_standard_protocol = true;
				resp_str += protocol->Execute(package);
			}
			else{
				break;
			}
		}
		
		// 如果没有标准协议数据，尝试作为telnet直接输入处理
		if(!has_standard_protocol && !inbuffer.empty()){
			// 查找换行符，处理每一行输入
			size_t pos = 0;
			while((pos = inbuffer.find('\n')) != std::string::npos){
				std::string line = inbuffer.substr(0, pos);
				// 去除回车符和空格
				line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
				line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
				
				if(!line.empty()){
					// 直接调用Execute处理这一行输入
					resp_str += protocol->Execute(line);
				}
				
				// 移除已处理的行
				inbuffer.erase(0, pos + 1);
			}
		}
		
		return resp_str;
	});

	// 创建Reactor
	std::unique_ptr<Reactor> r = std::make_unique<Reactor>();
	// 将监听模块交给Reactor管理
	r->AddConnection(conn);
	// 启动Reactor
	r->Loop();

	r->Stop();

	return 0;
}